//
// Created by lfm on 2025/3/15.
//
//#include <iostream>
//using namespace std;
////多态案例二制作饮品
////这是我们制作饮品的抽象类,用来定义共性的行为
////具体的饮品类继承这个抽象类，并实现自己的行为
//class AbstractDrinking
//{
//public:
//    //煮水
//    virtual void Boil() = 0;
//
//    //冲泡
//    virtual void Brew() = 0;
//
//    //    倒入杯子
//    virtual void PourInCup() = 0;
//
//    //加入辅助佐料
//    virtual void PutSomething() = 0;
//
//    //制作饮品
//    void makeDrink()
//    {
//        Boil();
//        Brew();
//        PourInCup();
//        PutSomething();
//    }
//};
////然后我们来实现具体的饮品类
////它们通过继承AbstractDrinking类，并实现自己的行为
////它们和继承的区别是，它们实现了父类的虚函数,而不是直接继承父类相比于继承，继承只是复制了父类的代码，并没有调用父类的构造函数和析构函数
////制作咖啡
//class Coffee : public AbstractDrinking
//{
//public :
//    virtual void Boil()
//    {
//        cout << "煮水" << endl;
//    }
//    virtual void Brew()
//    {
//        cout << "冲泡咖啡" << endl;
//    }
//    virtual void PourInCup()
//    {
//        cout << "倒入杯子" << endl;
//    }
//    virtual void PutSomething()
//    {
//        cout << "加入糖和牛奶" << endl;
//    }
//};
//
////制作茶叶
//class Tea : public AbstractDrinking
//{
//public :
//    //重写父类的虚函数
//    virtual void Boil()
//    {
//        cout << "煮水" << endl;
//    }
//    virtual void Brew()
//    {
//        cout << "冲泡茶叶" << endl;
//    }
//    virtual void PourInCup()
//    {
//        cout << "倒入杯子" << endl;
//    }
//    virtual void PutSomething()
//    {
//        cout << "加入柠檬" << endl;
//    }
//};
////以上都实现了制作饮品的抽象类，并实现了具体的饮品类，然后呢？
////我们可以把制作饮品的过程抽象成一个接口，然后通过这个接口来调用具体的饮品类，这样就实现了多态。
////一个接口有多个实现类，这就是多态的应用
////制作函数
////这个函数作为一个接口，可以接受任意类型的AbstractDrinking的子类作为参数
//void doWork(AbstractDrinking *p)
//{
//    p->makeDrink();
//    delete p;//释放
//
//}
////那么我们就试试吧，看看能不能制作出咖啡和茶叶
//void test01()
//{
//    //制作咖啡
//    doWork(new Coffee);
//
//
//    //制作茶叶
//    doWork(new Tea);
//}
//int main()
//{
//    test01();
//    return 0;
//}
//
//总结一下：
//1. 多态是面向对象编程的重要特性，它允许不同类的对象对同一消息作出不同的响应。
//2. 多态的实现方式是通过虚函数，父类中定义虚函数，子类继承父类，并实现自己的虚函数，这样就可以实现多态。
//3. 多态的应用场景是，父类定义一个接口，子类继承父类，并实现自己的行为，这样就可以通过父类的指针调用子类的行为，实现了代码的解耦。
//它和继承的区别是，继承只是复制了父类的代码，并没有调用父类的构造函数和析构函数，而多态则是通过虚函数实现的。